package com.kingmed.kmss.bpmn.modules.backup.service.impl;


import java.util.HashMap;
import java.util.List;
import java.util.Map;

import com.kingmed.kmss.bpmn.modules.backup.mapper.TaskMapper;
import com.kingmed.kmss.bpmn.modules.backup.model.Task;
import com.kingmed.kmss.bpmn.modules.backup.service.ITaskService;
import org.flowable.identitylink.api.IdentityLinkType;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.kingmed.kmss.common.bo.bpmn.TaskBO;
import com.kingmed.kmss.common.qc.bpmn.TaskQueryCondition;
import com.kingmed.kmss.common.utils.BeanCopyUtils;

/**
 * <p>
 * 服务实现类
 * </p>
 *
 * @author lilin
 */
@Service
public class TaskServiceImpl extends ServiceImpl<TaskMapper, Task> implements ITaskService {
    @Autowired
    private TaskMapper taskMapper;


    public Page<TaskBO> findMyTask(Page<TaskBO> page, String userId, String groupId) {
        TaskQueryCondition qryCond = new TaskQueryCondition();
        qryCond.setCandidateUserId(userId);
        qryCond.setGroupId(groupId);
        qryCond.setAssigneeId(userId);
        qryCond.setIdentityType("candidate");

        Map<String, Object> paramMap = new HashMap<>();
        QueryWrapper<TaskBO> wrapper = new QueryWrapper<>();
        wrapper.orderByDesc("startTime");
        paramMap = BeanCopyUtils.copyToMap(qryCond);
        List<TaskBO> tasks = taskMapper.selectMyTask(page, paramMap, wrapper);
        //List<TaskBO> tasks = taskMapper.selectMyTask(page, paramMap, Wrappers.<TaskBO>lambdaQuery().orderByDesc(TaskBO::getStartTime));

        //根据官方文档，这里使用lamda条件构造器有bug，所以改为QueryWrapper，字段名采用硬编码方式
        //问题原因找到，因为通过lamda方式，生成的customSqlSegment是下划线，而sql里是驼峰命名，其实mybatis可以自动将下划线转驼峰再进行映射，我们无需在sql里as成驼峰命名
        return page.setRecords(tasks);
    }


    public Page<TaskBO> findMyTask(Page<TaskBO> page, String userId, String groupId, String processDefinitionId) {
        TaskQueryCondition qryCond = new TaskQueryCondition();
        qryCond.setCandidateUserId(userId);
        qryCond.setGroupId(groupId);
        qryCond.setAssigneeId(userId);
        qryCond.setIdentityType(IdentityLinkType.CANDIDATE);

        Map<String, Object> paramMap = new HashMap<>();
        paramMap = BeanCopyUtils.copyToMap(qryCond);
        //根据官方文档，这里使用lambda条件构造器有bug，所以改为QueryWrapper，字段名采用硬编码方式
        QueryWrapper<TaskBO> wrapper = new QueryWrapper<>();
        wrapper.like("processDefinitionId", processDefinitionId).orderByDesc("startTime");
        //Wrapper wrapper = Wrappers.<TaskBO>lambdaQuery().orderByDesc(TaskBO::getStartTime);


        //问题原因找到，因为通过lambda方式，生成的customSqlSegment是下划线，而sql里的字段是驼峰命名。
        //其实sql里没有必要转成驼峰，mybatis可以自动将下划线转驼峰再进行映射，我们无需在sql里as成驼峰命名。
        //但是由于flowable的表字段不是标准的下划线，如果映射到BO,还是需要alias一遍？
        List<TaskBO> tasks = taskMapper.selectMyTask(page, paramMap, wrapper);
        return page.setRecords(tasks);
    }

}
